# 动态语言支持创建一个类实例后，再给实例绑定属性或者方法

class Student():
    pass

s = Student()
def set_age(self, age): # 定义一个函数作为实例方法
    self.age = age

from types import MethodType
s.set_age = MethodType(set_age, s) # 给实例绑定一个方法
s.set_age(25) # 调用实例方法
print(s.age) # 测试结果

# 但是这样给一个实例绑定的方法，对另一个实例是不起作用的
s2 = Student()
print(hasattr(s2, 'set_age'))

# 还可以动态给类绑定属性或者方法
Student.set_age = set_age

print(hasattr(s2, 'set_age'))

# 如果要限制可以动态绑定的属性，可以使用__slots__变量进行限制
class Student(object):
    __slots__ = ('name', 'age')
    def __init__(self):
        return

s = Student()
s.age = 10
s.name = 'rdn'
print(s.age)
print(s.name)

try:
    s.score = 100
    print(s.score)
except:
    print("can not set score as Student attr")